const { DataTypes, Model } = require('sequelize')
const bcryptjs = require('bcryptjs')
const db = require('../core/db')
const { CustomError } = require('../core/common')
class User extends Model { }

User.init({
  // 在这里定义模型属性
  uid: {
    type: DataTypes.INTEGER,
    primaryKey: true, // 主键 唯一标识
    autoIncrement: true,// 自增
    comment: "用户ID"
  },
  phone: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true,
    validate: {
      notEmpty: {
        msg: '手机号不能为空'
      },
      // 自定义验证器的示例:
      isPhoneFormat(value) {
        const reg_tel = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
        if (!reg_tel.test(value)) {
          throw new CustomError('手机号格式不正确', 402)
        }
      }
    },
    comment: "手机号"
  },
  password: {
    type: DataTypes.STRING,
    set(value) {
      if (value.length < 6) {
        throw new CustomError('密码至少6位', 402)
      }
      // 在数据库中以明文形式存储密码是很糟糕的.
      // 使用适当的哈希函数来加密哈希值更好.
      const salt = bcryptjs.genSaltSync(10)
      // 10 计算机生成salt 的成本 ，成本越高，安全性越高 ,salt 作用 即使密码相同，加密生成的值也不同
      const psw_hash = bcryptjs.hashSync(value, salt)
      this.setDataValue('password', psw_hash)
    },
    comment: "密码"
  },
  avatar: {
    type: DataTypes.STRING,
    allowNull: false,
    defaultValue: "https://b3logfile.com/avatar/1603003053057_1603083508110.jpeg?imageView2/1/w/128/h/128/interlace/0/q/100",
    validate: {
      notEmpty: {
        msg: '头像不能为空'
      },
    },
    comment: "头像"
  },
  nickName: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true,
    validate: {
      notEmpty: {
        msg: '昵称不能为空'
      },
    },
    comment: "昵称"
  },
  desc: {
    type: DataTypes.STRING,
    allowNull: true,
    comment: "简介"
  },
  homeBg:{
    type: DataTypes.STRING,
    allowNull: false,
    defaultValue: "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1886815664,3042078165&fm=26&gp=0.jpg",
    validate: {
      notEmpty: {
        msg: '背景不能为空'
      },
    },
    comment: "主页背景"
  },
  userInfo: {
    type: DataTypes.VIRTUAL,
    get() {
      return {
        phone:this.phone,
        avatar:this.avatar,
        nickName:this.nickName,
        desc:this.desc,
        uid:this.uid
      }
    },
  }
}, {
  // 这是其他模型参数
  sequelize: db, // 我们需要传递连接实例
  modelName: 'User' // 我们需要选择模型名称
})

module.exports = User
